
package modelo.dao.impl;

import java.util.List;
import modelo.dao.inter.IOperadoraDAO;
import java.sql.*;
import java.util.ArrayList;
import modelo.dto.*;

public class OperadoraImpl extends GenericoImpl implements IOperadoraDAO {
    
    public OperadoraImpl(Connection conn) {
        super(conn);
    }
    
    @Override
    public boolean cadastrar(Object obj) throws SQLException {
    	Operadora operadora = (Operadora) obj;
        
        super.sql = "INSERT INTO operadora(descricao) VALUES(?)";             
        
        try {
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setString(1, operadora.getNomeOperadora());
            
            super.efetuou = !super.pstm.execute();
            
            super.conn.commit();
                                   
        } 
        catch (SQLException e) {
        	super.pstm.getConnection().rollback();
        	e.printStackTrace();
			super.pstm.getConnection().rollback();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return super.efetuou;
    }

    @Override
    public boolean atualizar(Object obj) throws SQLException {
    	Operadora operadora = (Operadora) obj;
        
        super.sql = "UPDATE operadora SET descricao= ? WHERE id_operadora= ?";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setString(1, operadora.getNomeOperadora());
            super.pstm.setInt(2, operadora.getCodigo());
            
            super.efetuou = !super.pstm.execute();
            
            super.conn.commit();
        } 
        catch (SQLException e) {
        	super.conn.rollback();
        	e.printStackTrace();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return super.efetuou;
    }

    @Override
    public boolean excluir(Object obj) throws SQLException {
    	Operadora operadora = (Operadora) obj;
        
        super.sql = "DELETE FROM operadora WHERE id_operadora= ?";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setInt(1, operadora.getCodigo());
            
            super.efetuou = !super.pstm.execute();
            
            super.conn.commit();
        } 
        catch (SQLException e) {
        	super.conn.rollback();
        	e.printStackTrace();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return super.efetuou;
    }

    @Override
    public List<Operadora> buscarTodos() throws SQLException {
    	List<Operadora> listOperadoras = new ArrayList<Operadora>();        
        Operadora operadora = null;
        
        super.sql = "SELECT * FROM operadora ORDER BY descricao";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);            
            super.res = super.pstm.executeQuery();
                                  
            while(super.res.next()) {
            	operadora = new Operadora();
                operadora.setCodigo(super.res.getInt("id_operadora"));
                operadora.setNomeOperadora(super.res.getString("descricao"));
                
                listOperadoras.add(operadora);                                                                            
            }
            
            super.conn.commit();
        } 
        catch (SQLException e) {
        	super.conn.rollback();
        	e.printStackTrace();        	        	
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return listOperadoras;
    }

    @Override
    public Operadora getObjetoById(Object obj) throws SQLException {
    	Operadora operadora = (Operadora) obj;
        
        super.sql = "SELECT * FROM operadora WHERE id_operadora= ? ORDER BY descricao";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);            
            super.pstm.setInt(1, operadora.getCodigo());
            
            super.res = super.pstm.executeQuery();
            
            super.conn.commit();
            
            if(super.res.next()){
            	            	            
                operadora = new Operadora(super.res.getInt("id_operadora"), super.res.getString("descricao"));
                
                //operadora.setCodigo(super.res.).getInt("id_operadora"));
                //operadora.setDescricao(super.res.).getString("descricao"));                                
            }            
            
        } 
        catch (SQLException e) {        	
        	super.conn.rollback();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return operadora;
    }

    @Override
    public List<Operadora> buscarByNomeOperadora(Operadora operadora) throws SQLException {
        List<Operadora> listOperadoras = new ArrayList<Operadora>();
        
        super.sql = "SELECT * FROM operadora WHERE descricao LIKE ? ORDER BY descricao";
        
        try {                        
            super.pstm = super.conn.prepareStatement(super.sql);
            super.pstm.setString(1, operadora.getNomeOperadora()+"%");
            
            super.res = super.pstm.executeQuery();
            
            super.conn.commit();                       
            
            while(super.res.next()) {
            	operadora = new Operadora();
                operadora.setCodigo(super.res.getInt("id_operadora"));
                operadora.setNomeOperadora(super.res.getString("descricao"));
                
                listOperadoras.add(operadora);
            }
            
        }
        catch (SQLException e) {
        	super.conn.rollback();
        	e.printStackTrace();
            System.out.println("Erro: "+e.getMessage());
            throw new SQLException(e.getMessage());
        }
        
        return listOperadoras;
    }

	@Override
	public List<Operadora> buscarOperadoraByTelefone(Telefone telefone) throws SQLException {
		List<Operadora> ops = new ArrayList<Operadora>();
		Operadora oper = null;
		Telefone tel = null;
	
		super.sql = "SELECT * FROM operadora as oper " +
				"INNER JOIN telefone as tel " +
				"ON oper.id_operadora = tel.fk_operadora " +
				"WHERE oper.id_operadora= ? ORDER BY oper.descricao";
		
		try {
			super.pstm = conn.prepareStatement(super.sql);
			super.pstm.setInt(1, telefone.getCodigo());
			super.res = super.pstm.executeQuery();
			super.pstm.getConnection().commit();						
				
			while(super.res.next()) {
				oper = new Operadora();
				oper.setCodigo(super.res.getInt("id_operadora"));
				oper.setNomeOperadora(super.res.getString("descricao"));
				
				tel = new Telefone(super.res.getInt("id_telefone"), super.res.getString("numero"));				
				oper.adicionarTelefone(tel);
				
				ops.add(oper);
			}
			
		}
		catch (SQLException e) {
			super.pstm.getConnection().rollback();
			e.printStackTrace();
			System.out.println("Erro: "+e.getMessage());
			throw new SQLException(e.getMessage());
		}
				
		return ops;
	}
	    
}
